import pandas as pd
from pyecharts.charts import Map
from pyecharts import options as opts
from collections import Counter
import os


# 这是最关键的步骤：创建一个名称映射字典
name_map = {
    "北京": "北京市",
    "天津": "天津市",
    "上海": "上海市",
    "重庆": "重庆市",
    "河北": "河北省",
    "山西": "山西省",
    "辽宁": "辽宁省",
    "吉林": "吉林省",
    "黑龙江": "黑龙江省",
    "江苏": "江苏省",
    "浙江": "浙江省",
    "安徽": "安徽省",
    "福建": "福建省",
    "江西": "江西省",
    "山东": "山东省",
    "河南": "河南省",
    "湖北": "湖北省",
    "湖南": "湖南省",
    "广东": "广东省",
    "海南": "海南省",
    "四川": "四川省",
    "贵州": "贵州省",
    "云南": "云南省",
    "陕西": "陕西省",
    "甘肃": "甘肃省",
    "青海": "青海省",
    "台湾": "台湾省",
    "香港": "香港特别行政区",
    "澳门": "澳门特别行政区",
    "广西": "广西壮族自治区",
    "内蒙古": "内蒙古自治区",
    "西藏": "西藏自治区",
    "宁夏": "宁夏回族自治区",
    "新疆": "新疆维吾尔自治区"
}

# 假设你的 DataFrame 名称为 df，且包含一个名为 "省市" 的列
# 如果列名不同，请将下面代码中的 "省市" 替换为你的实际列名

def visualize_university_counts(df):
    """
    使用 pyecharts 对各省市高校数量进行地图可视化
    
    参数:
    df: pandas DataFrame，包含高校信息的 DataFrame
    province_col: str，表示省市信息的列名，默认为 "省市"
    """
    
    # 1. 数据预处理 - 统计各省市高校数量
    # 过滤空值
    # province_data = df[province_col].dropna()
    
    # 统计每个省市的高校数量
    # province_counts = Counter(province_data)
    
    # 2. 数据格式转换 - 适配 pyecharts 要求
    # 将省市名称转换为 pyecharts 要求的格式（去掉"省"、"市"、"自治区"等后缀）
    formatted_data = []
    
    # for province, count in province_counts.items():
    #     # 处理省市名称，使其符合 pyecharts 的地图标准
    #     formatted_province = format_province_name(province)
    #     formatted_data.append((formatted_province, int(count)))
    # for index,row in df.iterrows():
    #     formatted_data.append((name_map[row['省市']],row['大学数量']))
    # 先建立省市到数量的映射
    province_count_map = dict(zip(df['省市'], df['大学数量']))

    # 遍历 name_map
    for short_name, full_name in name_map.items():
        count = province_count_map.get(short_name, 0)
        # 处理 NaN 值
        if pd.isna(count):
            count = 0
        formatted_data.append((full_name, int(count)))

    # formatted_data.append(('上海市',7))
    print(formatted_data[:10])
    
    # recognize_zone(formatted_data)
    
    # 3. 创建地图可视化
    # 参考页面：https://pyecharts.org/#/zh-cn/geography_charts?id=map%ef%bc%9a%e5%9c%b0%e5%9b%be
    map_chart = (
        Map(init_opts=opts.InitOpts(width="1000px", height="600px"))
        .add(
            series_name="TOP高校数量",
            data_pair=formatted_data,
            maptype="china",
            is_map_symbol_show=False,  # 不显示标记点
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="全国各省市高校数量分布图",
                subtitle="数据来源：大学排名信息",
                pos_left="center"
            ),
            visualmap_opts=opts.VisualMapOpts(
                max_=20,
                is_piecewise=True,  # 分段式显示
                range_text=["高", "低"],
                pieces=[
                    {"min": 15, "label": "15所以上", "color": "#8B0000"},
                    {"min": 10, "max": 14, "label": "10-14所", "color": "#FF4500"},
                    {"min": 5, "max": 9, "label": "5-9所", "color": "#FFA500"},
                    {"min": 2, "max": 4, "label": "2-4所", "color": "#FFD700"},
                    {"min": 1, "max": 1, "label": "1所", "color": "#FFFACD"}
                ]
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
        .set_series_opts(
            label_opts=opts.LabelOpts(
                is_show=True,
                formatter="{b}: {c}所",
                font_size=10,
                color="#000"
            )
        )
    )
    
    # 4. 保存和渲染地图
    output_file = os.getcwd()+'\\4 - 数据统计描述性分析\\output\\university_distribution_map.html'
    map_chart.render(output_file)
    print(f"地图已生成并保存为: {output_file}")
    
    return map_chart

def format_province_name(province_name):
    """
    将省市名称格式化为 pyecharts 地图可识别的格式
    
    参数:
    province_name: str，原始省市名称
    
    返回:
    str: 格式化后的省市名称
    """
    # 移除常见的后缀
    suffixes = ['省', '市', '自治区', '壮族', '回族', '维吾尔', '特别行政区']
    formatted_name = province_name
    
    for suffix in suffixes:
        if formatted_name.endswith(suffix):
            formatted_name = formatted_name.replace(suffix, '')
            break
    
    # 处理特殊案例
    special_cases = {
        '内蒙古自治区': '内蒙古',
        '广西壮族自治区': '广西',
        '西藏自治区': '西藏',
        '宁夏回族自治区': '宁夏',
        '新疆维吾尔自治区': '新疆',
        '香港特别行政区': '香港',
        '澳门特别行政区': '澳门'
    }
    
    return special_cases.get(province_name, formatted_name)

# 示例使用方式
if __name__ == "__main__":
    # 创建示例数据（实际使用时请注释掉这部分，直接使用你的 DataFrame）
    # sample_data = {
    #     '省市': ['北京市', '上海市', '江苏省', '江苏省', '江苏省', '广东省', '广东省', 
    #             '浙江省', '浙江省', '湖北省', '陕西省', '四川省', '四川省', '四川省'],
    #     '学校名称': ['北京大学', '复旦大学', '南京大学', '东南大学', '南京理工大学', 
    #               '中山大学', '华南理工大学', '浙江大学', '杭州大学', '武汉大学', 
    #               '西安交通大学', '四川大学', '电子科技大学', '西南交通大学']
    # }
    # df_sample = pd.DataFrame(sample_data)
    
    # 调用可视化函数
    # chart = visualize_university_counts(df_sample)
    
    # 实际使用时，请取消注释下面的代码，并注释掉上面的示例数据部分
    # 1. 按'省市'列分组，并统计每组的大小（即大学数量）
    # print(os.getcwd())
    df=pd.read_excel(os.getcwd()+'\\4 - 数据统计描述性分析\\2020年中国大学排名.xlsx')
    university_counts = df.groupby('省市').size()

    # 2. （可选）将Series结果转换为DataFrame，使结果更规整
    university_counts_df = university_counts.reset_index(name='大学数量')
    # print(university_counts_df.head())

    
    chart = visualize_university_counts(university_counts_df)